package ar.uba.fi.celdas7568.ciudad;

import java.io.File;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;

public class Ciudad implements Iterable<Zona>{

	Multimap<Zona, Agente> agentes = LinkedListMultimap.create();
	Set<Zona> zonas = Sets.newHashSet();

	public Ciudad(String archivoXml) {
		try {

			File fXmlFile = new File(archivoXml);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fXmlFile);
			doc.getDocumentElement().normalize();

			NodeList nList = doc.getElementsByTagName("zona");

			for (int temp = 0; temp < nList.getLength(); temp++) {

				Node nNode = nList.item(temp);
				if (nNode.getNodeType() == Node.ELEMENT_NODE) {

					Element eElement = (Element) nNode;
					Zona zona = cargarZona(eElement);
					
					this.zonas.add(zona);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	private Zona cargarZona(Element eElement) {
		Zona zona = new Zona();
		
		zona.numero = Integer.parseInt(getTagValue("numero", eElement));
		zona.caracteristicas.bares = Integer.parseInt(getTagValue("bares", eElement));
		zona.caracteristicas.bibliotecas = Integer.parseInt(getTagValue("bibliotecas", eElement));
		zona.caracteristicas.carceles = Integer.parseInt(getTagValue("carceles", eElement));
		zona.caracteristicas.casinos = Integer.parseInt(getTagValue("casinos", eElement));
		zona.caracteristicas.cines = Integer.parseInt(getTagValue("cines", eElement));
		zona.caracteristicas.colectivos = Integer.parseInt(getTagValue("colectivos", eElement));
		zona.caracteristicas.comisarias = Integer.parseInt(getTagValue("comisarias", eElement));
		zona.caracteristicas.densidadPoblacional = Float.parseFloat(getTagValue("densidadPoblacional", eElement));
		zona.caracteristicas.escuelas = Integer.parseInt(getTagValue("escuelas", eElement));
		zona.caracteristicas.museos = Integer.parseInt(getTagValue("museos", eElement));
		zona.caracteristicas.parques = Integer.parseInt(getTagValue("parques", eElement));
		zona.caracteristicas.plazas = Integer.parseInt(getTagValue("plazas", eElement));
		zona.caracteristicas.poderAdquisitivo = Float.parseFloat(getTagValue("poderAdquisitivo", eElement));
		zona.caracteristicas.ruido = Float.parseFloat(getTagValue("ruido", eElement));
		zona.caracteristicas.subtes = Integer.parseInt(getTagValue("subtes", eElement));
		zona.caracteristicas.suciedad = Float.parseFloat(getTagValue("suciedad", eElement));
		zona.caracteristicas.teatros = Integer.parseInt(getTagValue("teatros", eElement));
		zona.caracteristicas.transito = Float.parseFloat(getTagValue("transito", eElement));
		zona.caracteristicas.universidades = Integer.parseInt(getTagValue("universidades", eElement));
		zona.caracteristicas.valorMedioTierra = Float.parseFloat(getTagValue("valorMedioTierra", eElement));		
		
		return zona;
	}

	private String getTagValue(String sTag, Element eElement) {
		NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
		Node nValue = (Node) nlList.item(0);
		return nValue.getNodeValue();
	}

	public void agregarAgente(Agente agente){
		Zona zonaElegida = agente.elegirZona(this);
		agentes.put(zonaElegida, agente);		
	}

	public Iterator<Zona> iterator() {
		return zonas.iterator();
	}

	public Collection<Agente> getAgentesEnZona(Zona zona){
		return agentes.get(zona);
	}

}
